Android Tips #49 Android Query を使って jQuery 風に超シンプルにコーディングする
Android Query とは
Android Query とは、Android アプリの実装を jQuery のようにコーディングできるようにするライブラリです。UI に関わる処理や非同期処理などをメソッドチェーンなどを利用して簡潔に記述することができます。今回はそんな Android Query をちょっと触ってみました。
Android Query を導入する
まずは以下のダウンロードページからライブラリをダウンロードしましょう。最新バージョンは 0.25.10 のようです (2013年5月14日現在) 。
https://code.google.com/p/android-query/downloads/list
ダウンロードしたら、お好きな Android アプリプロジェクトの libs フォルダに配置すれば完了です!
Android Query で実装する
では早速実装してみましょう。いろいろな処理を Android Query を使わない場合と使った場合でそれぞれ Before / After してみました。
View の操作
Before
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ボタンにリスナをセットする findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Log.d(TAG, "button clicked"); } }); // TextViewにテキストをセットする TextView textView = (TextView) findViewById(R.id.text_view); textView.setText("Test"); }
After
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AQuery aq = new AQuery(this); // ボタンにリスナをセットする aq.id(R.id.button).clicked(this, "onClick"); // TextViewにテキストをセットする aq.id(R.id.text_view).text("Test"); } public void onClick(View view) { Log.d(TAG, "button clicked"); }
Button にリスナをセットするコードと TextView にテキストをセットするコードの比較です。Android Query は基本的に AQuery インスタンスを使ってコーディングしていきます。findViewById() にあたるメソッドが id() 、setOnClickListener() にあたるメソッドが clicked() になります。メソッド名も jQuery っぽいので分かりやすいですし、何よりメソッド名が短いのでコードがコンパクトになりますね。また TextView にキャストしなくてもテキストをセットできます。冗長にならないのでいい感じですね!
HTTP 通信
Before
public class JsonLoader extends AsyncTaskLoader<JSONObject> { public JsonLoader(Context context) { super(context); forceLoad(); } @Override public JSONObject loadInBackground() { String url="http://www.google.com/uds/GnewsSearch?q=Obama&v=1.0"; HttpClient httpClient = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse res = null; try { res = httpClient.execute(get); HttpEntity entity = res.getEntity(); String body = EntityUtils.toString(entity); return new JSONObject(body); } catch (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; } }
After
public void asyncJson() { AQuery aq = new AQuery(this); String url = "http://www.google.com/uds/GnewsSearch?q=Obama&v=1.0"; aq.ajax(url, JSONObject.class, this, "jsonCallback"); } public void jsonCallback(String url, JSONObject json, AjaxStatus status) { if (json != null) { Log.d(TAG, json.toString()); } else { Log.e(TAG, "error"); } }
HTTP 通信処理(非同期処理)は劇的に変わりますね!Before のコードは AsyncTaskLoader の実装だけ載せましたが、さらにこのクラスのコールバックも実装しなければいけません。。それに対し Android Query は ajax() メソッドを呼び出すだけ!超シンプルになりますね〜。
画像のロード
Before
public class ImageLoader extends AsyncTaskLoader<Bitmap> { public ImageLoader(Context context) { super(context); forceLoad(); } @Override public Bitmap loadInBackground() { try { URL url = new URL("http://www.vikispot.com/z/images/vikispot/android-w.png"); InputStream stream; stream = url.openStream(); return BitmapFactory.decodeStream(stream); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }
After
private void loadImage() { AQuery aq = new AQuery(this); aq.id(R.id.image_view).image("http://www.vikispot.com/z/images/vikispot/android-w.png"); }
この処理も劇的に変わりますね!画像 URL を非同期で読み込む処理ですが、こちらも Before は AsyncTaskLoader の実装を載せましたが、HTTP 通信処理同様、さらにこれを Activity から呼び出し ImageView にセットする処理も書かなければいけません。Android Query では id() で ImageView を取得し、そのままメソッドチェーンで書いてます。これだけで非同期処理までやってくれます。超楽ですね!メモリキャッシュ・ファイルキャッシュにも対応しているメソッドがあるので、かゆいところにも手が届いています。
まとめ
以上、Android Query の簡単な紹介でした。特に非同期通信処理の実装が劇的にシンプルになりますね!メソッドチェーンで柔軟、かつ簡潔にコーディングできて良い感じです。ちなみに Apache Lisencse 2.0 なので商用利用も可ですし、ソースコードは GitHub で公開されているので自分で拡張することもできます。まずはお試しあれ!